# 先看关于所有的类属性与方法的总结
# 变量
# 1.类变量
#     name = "default"
#     age = 0
#     gender = "male"
#     weight = 0
# 类调用和修改类变量：
#    调用
#    print(Person.name)
#
#    修改--修改后类调用和对象调用都会修改
#    Person.name ="paul"
#
#    print(Person.name)
#    print(zs.name)
#
# 对象调用和修改类变量：
#     调用
#     print(zs.name)
#
#     修改--修改后对象修改会改变，但是类调用不会改变，还是之前的类变量
#     zs.name="lili"
#
#     print(zs.name)
#     print(Person.name)
#
# 2.对象变量
# 普通的def函数里面传参的变量或者__init__方法的传参变量
#
#        self.name=name
#        self.age=age
#        self.gender=gender
#        self.weight=weight
#
# 类调用和修改对象属性：
#   都不能调用和修改
#   Person.height     报错
#   Person.height=180 报错
#
#
# 对象调用和修改属性
#   print(zs.name)
#   zs.name ="lisi"
#
# 方法
#
# 1.对象方法
#   普通的def函数里面的方法
#       def eat(self):
#            print("eating")
#   类调用和修改对象方法：
#       不能调用也不能修改对象方法，会报错
#
#   对象调用和修改对象方法：
#       zs.eat()
#
# 2.类方法
#   普通的def函数里面的方法加一个装饰器@classmethod
#       @classmethod
#       def play(self):
#            print("playing")
#
#   类调用和修改类方法：
#       Person.play()
#
#   对象调用和修改方法：
#       zs.play()
#
# 总结：
#   1.类可以调用和修改类变量和类方法，不能调用和修改对象变量和对象方法
#   2.对象既可以调用和修改类变量和类属性(但是仅限于对象本身的，不能修改类的，和其他对象的)，也可以调用和修改对象变量和对象方法(仅限于修改本地的，不能修改其他对象的)


# 通过class定义一个人类
class Person:
    name ="default"
    age =0
    gender ="male"
    weight =0

    # 只要是定义了方法，self参数是默认必须传递的，代表类本身
    def eat(self):
        print("eating")

    def play(self):
        print("playing")

    def jump(self):
        print("jump")

    def set_params(self,name):
        self.name =name

# 实例化一个对象，对象名 =类名()
zs = Person()
# 使用类变量，default，因为没有实例化名字使用类的变量
print(zs.name)

# 使用类来调用类变量，是类变量的值
print(Person.name)

# 修改了类变量后，使用类和对象来调用都会改变
Person.name ="wangwu"
print(Person.name)
print(zs.name)

# 使用方法，set进去了名称，可以有名字，并且代替类变量名字，但是这种set也是不够科学的，没有构造方法好，__init__方法
zs.set_params("zhangsan")
print(zs.name)
print(f"张三的姓名是{zs.name}")